package com.doit.day02;

import org.apache.commons.lang3.RandomUtils;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.Tuple;

import java.util.*;

/**
 * 每场比赛选择英雄：
 * 每隔5s统计一次，截止到现在为止，每个英雄被选择的次数排名，前三名
 * 热度最高
 */
public class HeroTopN {
    public static void main(String[] args) throws InterruptedException {
        //搞一个redis的对象
        JedisPool pool = new JedisPool("linux01", 6379);
        Jedis jedis = pool.getResource();
        //开启英雄出场的线程
        new Thread(new HeroComming(jedis)).start();

        //接下来每隔5s统计一次截止到现在为止，英雄被选择的次数的前三名
        //定时器
        Timer timer = new Timer();
        timer.schedule(new MyTimerTak(jedis),3000,5000);


    }
}

class HeroComming implements Runnable{
    private Jedis jedis = null;

    public HeroComming(Jedis jedis){
        this.jedis = jedis;
    }

    @Override
    public void run() {

        //首先模拟英雄出场
        ArrayList<String> list = new ArrayList<>();
        list.add("号丝给");
        list.add("儿童劫");
        list.add("瞎子");
        list.add("麻辣小龙虾");
        list.add("火男");
        list.add("琴女");

        //要让英雄随机出场,创建一个随机数(list的长度)，索引
        Random random = new Random();

        while (true){
            int index = random.nextInt(list.size());
//            System.out.println("儿童节放假了，小学生出来坑人了，选择的英雄是："+list.get(index));
            //随机出来了英雄以后，给次数加一==》 放在哪里  redis里面可以排序 sorted set ==》 元素  score 次数
            //让英雄出场的次数，每次都加一
            jedis.zincrby("hero",1,list.get(index));
            try {
                Thread.sleep(RandomUtils.nextInt(20,150));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

//获取出hero这个key的前三名
class MyTimerTak extends TimerTask{
    private Jedis jedis;

    public MyTimerTak( Jedis jedis){
        this.jedis = jedis;
    }


    @Override
    public void run() {
        //Tuple  元祖
        Set<Tuple> hero = jedis.zrevrangeWithScores("hero", 0, 2);
        ArrayList<String> list = new ArrayList<>();
        for (Tuple tuple : hero) {
            String element = tuple.getElement();
            double score = tuple.getScore();
            list.add(element+":"+score);
        }
        System.out.println("=============="+System.currentTimeMillis()+"=================");
        System.out.println(list);
    }
}
